home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utmisc1 / fscode.lha / Src / CRC32.a next >
Text File  |  1995-11-13  |  2KB  |  107 lines

  1. **
  2. ** $VER: CRC32.a (24.1.95) by Flavio Stanchina
  3. ** Adapted from comp.compression FAQ
  4. **
  5. ** Changed to do one-byte-at-a-time CRC
  6. ** Don't complement CRC for simplicity
  7. **
  8. ** For your mental sanity, don't try to learn about CRC's from this code.
  9. ** Ask me for the C version of these routines instead.
  10. **
  11.  
  12.     INCLUDE    "CRC32.i"
  13.  
  14.     SECTION    text,code
  15.  
  16. ***** Build auxiliary table for parallel byte-at-a-time CRC-32. *****
  17. ; VOID CRC32_init(VOID)
  18.  
  19.     XDEF    @CRC32_init
  20.  
  21. @CRC32_init:
  22.     movem.l    D2-D3,-(A7)
  23.     lea    _CRC32_table,A0    ; load table pointer
  24.     move.l    #CRC32_POLY,D1    ; load poly once and for all
  25.      moveq.l    #0,D2
  26. loop_1     move.l    D2,D0
  27.      ror.l    #8,D0
  28.       moveq.l    #8,D3
  29. loop_2      add.l    D0,D0
  30.       bcc.s    test_2
  31.       eor.l    D1,D0
  32. test_2      subq.l    #1,D3
  33.       bgt.s    loop_2
  34.      move.l    D0,(A0)+
  35. test_1     addq.l    #1,D2
  36.      tst.b    D2        ; cmp.l #256,D2
  37.      bne.s    loop_1        ; blt.s loop_1
  38.     movem.l    (A7)+,D2-D3
  39.     rts
  40.  
  41. ***** Calculate CRC-32 on a byte stream. *****
  42. ; ULONG CRC32_stream(UBYTE c, ULONG crc)
  43.  
  44.     XDEF    @CRC32_stream
  45.  
  46. @CRC32_stream:
  47.     lea    _CRC32_table,A1
  48.     rol.l    #8,D1        ; will yield crc >> 24 and crc << 8
  49.     move.l    D1,A0        ; save for later
  50.  
  51.     eor.b    D1,D0        ; (crc >> 24) ^ c
  52.     moveq    #0,D1
  53.     move.b    D0,D1
  54.     lsl.w    #2,D1        ; multiply by 4
  55.     add.w    D1,A1
  56.     move.l    (A1),D0        ; crc32_table[(crc >> 24) ^ c]
  57.  
  58.     move.l    A0,D1
  59.     clr.b    D1        ; crc << 8
  60.  
  61.     eor.l    D1,D0        ; EOR together
  62.     rts
  63.  
  64. ***** Calculate CRC-32 on a block of bytes. *****
  65. ; ULONG CRC32_block (UBYTE *buf, ULONG len)
  66. ; ULONG CRC32_blocks(UBYTE *buf, ULONG len, ULONG crc)
  67. ; NOTE: this function can't complement the returned CRC, so none does for coherency.
  68.  
  69.     XDEF    @CRC32_block
  70.     XDEF    @CRC32_blocks
  71.  
  72. @CRC32_block:
  73. ;;;    moveq.l    #CRC32_INITIAL,D1    ; preload shift register, per CRC-32 spec
  74.     moveq.l    #-1,D1        ; preload shift register, per CRC-32 spec
  75.  
  76. @CRC32_blocks:
  77.     movem.l    D2-D3,-(A7)
  78.  
  79.     lea    _CRC32_table,A1
  80.  
  81. loop_bs     moveq.l    #0,D3
  82.      rol.l    #8,D1
  83.      move.b    D1,D3        ; (crc >> 24) & 0x000000FF
  84.      clr.b    D1        ; (crc <<  8) & 0xFFFFFF00
  85.  
  86.      move.b    (A0)+,D2
  87.      eor.b    D2,D3
  88.      lsl.w    #2,D3
  89.      move.l    0(A1,D3.w),D2
  90.      eor.l    D2,D1
  91.  
  92.      subq.l    #1,D0        ; while(--len)
  93.      bne.s    loop_bs
  94.  
  95. ;;;    not.l    D1        ; transmit complement, per CRC-32 spec
  96.     move.l    D1,D0
  97.  
  98.     movem.l    (A7)+,D2-D3
  99.     rts
  100.  
  101.     SECTION    __MERGED,BSS
  102.  
  103. _CRC32_table:
  104.     ds.l    256
  105.  
  106.     END
  107.